package core.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import util.DbUtils;

import core.dao.ListaDao;
import core.model.Lista;

/**
 * @author andoniibarguchilorenzo
 * clase que contiene los metodos implementados de la interface ListaDao
 */
public class ListaDaoImpl extends GenericDaoImpl<Lista, Integer> implements
		ListaDao {

	@Override
	public Lista findby(Timestamp fecha) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Lista> listas = new ArrayList<Lista>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_LISTA, TITULO, NICK, FECHA FROM LISTA WHERE FECHA = ?");
			ps.setTimestamp(1, fecha);

			ResultSet rs = ps.executeQuery();
			Lista lista = null;

			while (rs.next()) {
				lista = Lista.createLista(rs.getInt(1), rs.getString(2),
						rs.getString(3), rs.getTimestamp(4));
				listas.add(lista);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listas.get(0);
	}

	@Override
	public List<Lista> getAll() {
	
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Lista> listas = new ArrayList<Lista>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_LISTA, TITULO, NICK, FECHA FROM LISTA");

			ResultSet rs = ps.executeQuery();
			Lista lista = null;

			while (rs.next()) {
				lista = Lista.createLista(rs.getInt(1), rs.getString(2),
						rs.getString(3), rs.getTimestamp(4));
				listas.add(lista);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listas;
	}

	@Override
	public void insertLista(Lista lista) {
		
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection.prepareStatement(
					"INSERT INTO LISTA (TITULO, NICK, FECHA) VALUES (?,?,CURRENT_TIMESTAMP)",
					PreparedStatement.RETURN_GENERATED_KEYS);
			ps.setString(1, lista.getTitulo());
			ps.setString(2, lista.getNick());

			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void deleteLista(int cod_lista) {
		
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement("DELETE FROM LISTA WHERE COD_LISTA = ?");
			ps.setInt(1, cod_lista);

			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void modifyLista(Lista lista) {
		
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			ps = connection
					.prepareStatement("UPDATE LISTA SET TITULO = ?, NICK = ?, FECHA = ? ");
			ps.setString(1, lista.getTitulo());
			ps.setString(2, lista.getNick());
			ps.setTimestamp(3, lista.getFecha());
			//ps.setInt(4, lista.getCodigo_lista()); // codigo_LISTA
			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}

	}
	public int getCodigo(String nombre_lista)
	{
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		int codigo=-1;
		try {
			ps = connection
					.prepareStatement("SELECT COD_LISTA FROM LISTA WHERE TITULO = ?");
				ps.setString(1, nombre_lista);

			ResultSet rs = ps.executeQuery();

			
				codigo=rs.getInt(1);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return codigo;
	}
	public void insertProductoLista(int cod_empresa, String cod_producto, int cod_lista,int cantidad) {
		
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection.prepareStatement(
					"INSERT INTO CONTIENE (COD_EMPRESA,COD_PRODUCTO,COD_LISTA,CANTIDAD) VALUES (?,?,?,?)");
			ps.setInt(1, cod_empresa);
			ps.setString(2, cod_producto);
			ps.setInt(3,cod_lista );
			ps.setInt(4, cantidad);

			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public Lista findbyTitulo(String titulo_lista) {
		
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Lista> listas = new ArrayList<Lista>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_LISTA, TITULO, NICK, FECHA FROM LISTA WHERE TITULO = ?");
			ps.setString(1, titulo_lista);

			ResultSet rs = ps.executeQuery();
			Lista lista = null;

			while (rs.next()) {
				lista = Lista.createLista(rs.getInt(1), rs.getString(2),
						rs.getString(3), rs.getTimestamp(4));
				listas.add(lista);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listas.get(0);
	}
		
	}

